XDRush

深度学习在CTR预估中的应用之Neural FM

1 背景说明

Neural Factorization Machine(以下简称NFM)是最近由新加坡国立大学的Xiangnan He等人提出,并发表在SIGIR2017上的一篇文章。

这篇文章结合了神经网络和FM的思想,并且创造性的提出将FM的隐向量参与到神经网络的训练中去,同其他的以FM预先训练好再提供给神经网络相比,能有效的提升CTR。下面就对这篇文章做一个总结。

2 NFM基本思想

如作者所讲,这篇文章的贡献在于:

  • 在神经网络中首次提出Bi-Interaction池化这种思想,并同FM结合;
  • 基于上面提出的思想,创造出一个更深的FM模型,并且能够更好的学习高阶和非线性交叉特征;
  • NFM相比于其他模型,在性能上有较大提升;

2.1 关于特征交叉

(1)FM模型
FM是目前比较流行也是应用最多的处理特征交叉的模型,FM模型在这篇文章中有详细介绍,这里就不在多述。
FM表达式

(2)FM模型的限制
在这里,严格意义上作者将FM模型仍然当做线性模型来看待,这么做也是有道理的,其实也就是将二阶交叉特征做特征工程,然后给定一个系数;但是实际场景下的数据通常是highly non-linear,无法通过线性模型来很好的预估。因此,FM的线性表达能力就有了较大的限制。

这是因为这个限制,作者提出将二阶交叉特征的隐层空间进行非线性变化,从而使得模型能够表达高阶非线性特征。

2.2 NFM模型结构

鉴于上面的限制,作者提出了NFM,NFM做预估的表达式为:
NFM预估表达式

上式中,前面两项是FM中的LR部分,第三项$f(x)$是NFM的核心部分,这部分的任务就是学习高阶交叉特征,它是由一个多层前向神经网络构成,模型结构如下图所示:
NFM模型结构

(1)Embedding Layer
Embedding Layer是一个全连接层,因为DNN并不适合处理高稀疏性数据,这个全连接层的作用其实就是将稀疏特征转化为DNN能够处理的稠密特征。这里虽然是叫全连接层,其实在真正实现是的时候是通过查表方式来实现,将每个特征转化为一个对应的隐向量,从作者给出的开源实现中知道,隐向量的大小为64维。实际上,DNN中几乎所有的Embedding处理都是通过这种查表的方式实现,在训练过程中,不断更新表中的元素值。

1
nonzero_embeddings = tf.nn.embedding_lookup(self.weights['feature_embeddings'], self.train_features)

(2)Bi-Interaction
经过Embedding层之后,就得到了原始系数特征的稠密表示$V_x$,然后经过一个Bi-Interaction层,本质上这一层是一个pooling操作,将一组Embedding向量转化成一个向量:
Bi-Interaction原始表达

从上面表达式中可以看出,这一层将Embedding Layer得到的隐向量进行两两内积,然后将所有的两两内积进行就和。类似FM表达式,上式可以继续化简为:
Bi-Interaction化简表示

经过化简之后,Bi-Interaction层的计算复杂度为$O(kN_x)$,$N_x$表示原始系数特征中非零特征个数。

(3)Hidden Layer
Bi-Interaction层之后,紧接着就是Hidden-Layer,Hidden-Layer本质上是多层全连接神经网络:
Hidden Layer表示

这一层相对来说比较简单。这一层的作用就是提取高阶交叉特征。

(4)Prediction Layer
最后一层就是做预测,模型使用Hidden Layer最后的一层的输出做预测,最终DNN部分的得分为:
DNN部分得分

$h^T$是预测层的权重。

最后,将$f(x)$和LR部分结合起来就是最终NFM的输出:
NFM最终表达式

2.3 模型分析

(1)NFM与FM之间的关系
NFM模型和FM模型之间有什么关系呢?我们对比一下两个模型:
NFM最终表达式
FM表达式

如果我们去掉NFM的Hidden Layer呢?去掉之后,NFM的表达式如下:
NFM去掉Hidden Layer表达式

当$h$等于$(1,1,…,1)$时,不难发现:FM就是NFM去掉Hidden Layer的结果!这就是NFM的神奇之处之一。

(2)NFM与Wide&Deep、DeepCross之间的关系
作者指出,NFM同现有的若干个基于DNN的模型较为相似,最主要的差异在于Bi-Interaction的提出。如果将Bi-Interaction替换为MLP,那么NFM就能退化为Wide&Deep(或者DeepCross)模型,Wide&Deep一个明显的限制就是仅仅使用MLP的叠加无法更好的学习到交叉特征,要想较好的学习高阶交叉特征,就只能往Deep方向发展,这就必然导致训练难度增大、所需样本量也会更大。而Bi-Interaction在Low Level层面就能够学习到二阶交叉特征,这就比较有利于后面的Hidden Layer更好的学习更高阶的交叉特征。

(3)复杂度分析
上面已经分析了Bi-Interaction层的时间复杂度为$O(kNx)$,接下来看下Hidden Layer的复杂度,因为是MLP,每一层的时间复杂度为$O(d{l-1}dl)$,$l$表示当前层,$d_l$和$d{l-1}$表示当前层和上一层的神经元个数,因此,整个NFM的DNN部分时间复杂度为:
NFM DNN部分时间复杂度

这和Wide&Deep、DeepCross一样。

2.4 模型学习

(1)学习目标
NFM可以应用于一系列预测任务,包括回归、分类和排序,区别就在于损失函数的选取。对于回归任务,一般使用平方损失函数:
平方损失函数

(2)学习方法
学习方法使用的是mini-batch SGD:
mini-batch SGD

同样的,使用链式规则对参数更新;对于Bi-Interaction,参数更新过程有些不同:
Bi-Interaction参数更新过程

由上式可知,对于端到端的神经网络方法,加入Bi-Interaction依然能够端到端的学习。

(3)Dropout的使用
通常人物,DNN中使用Dropout比$L_1,L_2$正则化方法更有效,本文在训练过程中也是使用Dropout来避免过拟合。在Bi-Interaction层,以概率$p$随机的丢弃隐向量,同时在Hidden Layer也是用标准的Dropout。

(4)Batch Normalization
训练DNN的一个难点就是数据偏移,也就是在训练过程中,每一层输入数据的分布都可能不一样,从而导致收敛变慢。BN被认为能够加速模型的收敛速度,BN的原理就是在数据输入到每一层之前,对数据进行归一化处理,使得每次的数据服从同样的分布:
BN表达式

本文中,对Bi-Interaction层和Hidden Layer都使用了BN。

3 总结

文章的实验结果这里就不做细述,NFM性能肯定全方位占优。以上就是NFM的原理及思想,总结一下:

  • 方法的核心就是Bi-Interaction的提出,在low level层面做二阶交叉,在Hidden Layer做高阶特征交叉,从而提高性能;
  • 模型不需要pre-training,隐向量是在训练过程中不断更新的,避免了像FNN那样用FM pre-training带来的二次损失;

原论文的github实现请移步这里:https://github.com/hexiangnan/neural_factorization_machine